/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.admin.mapper;

import org.apache.ibatis.annotations.Param;
import org.springblade.modules.admin.dto.contract.ContractSearchDTO;
import org.springblade.modules.admin.dto.sugar.SugarSearchDTO;
import org.springblade.modules.admin.entity.BuildingContractExtPlus;
import org.springblade.modules.admin.entity.BuildingContractPlus;
import org.springblade.modules.admin.entity.ElevatorDetail;
import org.springblade.modules.admin.entity.MaintainPlanConfig;
import org.springblade.modules.admin.vo.BuildingContractPlusVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.modules.admin.vo.ContractBuildingHoverVo;
import org.springblade.modules.admin.vo.contract.ConEleDisposableVo;
import org.springblade.modules.admin.vo.contract.ContractBuildingInfoVo;
import org.springblade.modules.admin.vo.contract.ContractElevatorVo;
import org.springblade.modules.admin.vo.contract.ContractStatisticVo;
import org.springblade.modules.admin.vo.contract.v2.ContractInTimeVo;
import org.springblade.modules.admin.vo.contract.v2.ContractListVo;
import org.springblade.modules.admin.vo.contract.v2.ContractStatusCountVo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 项目合同信息 Mapper 接口
 *
 * @author ysq
 * @since 2022-03-01
 */
public interface BuildingContractPlusMapper extends BaseMapper<BuildingContractPlus> {

	/**
	 * 自定义分页
	 *
	 * @param page
	 * @param buildingContractPlus
	 * @return
	 */
	List<BuildingContractPlus> selectBuildingContractPlusPage(IPage page, @Param("buildingContractPlus") BuildingContractPlusVO buildingContractPlus);


	List<BuildingContractPlus> selectBuildingContractPlusPageV2(IPage page, @Param("buildingContractPlus") BuildingContractPlusVO buildingContractPlus);

	/**
	 * 获取合同类型统计信息
	 *
	 * @return 数据集
	 */
	ContractStatisticVo getContractStatisticInfo();


	/**
	 * 获取合同类型统计信息
	 *
	 * @return 数据集
	 */
	ContractStatisticVo getContractStatisticElevatorInfo();

	/**
	 * 获取电梯id 获取最近的维保合同
	 *
	 * @param elevatorId 电梯id
	 * @return 数据集
	 */
	BuildingContractPlus getDetailByElevator(@Param("elevatorId") Long elevatorId);


	/**
	 * 获取电梯id 获取最近的维保合同
	 *
	 * @param elevatorId 电梯id
	 * @return 数据集
	 */
	BuildingContractPlus getDetailByElevator_v2(@Param("elevatorId") Long elevatorId, @Param("beginTime") Date beginTime);


	/**
	 * 根据卢克合同id获取小区id
	 *
	 * @param id
	 * @return
	 */
	Long getbuildingIdByContractId(@Param("id") String id);

	/**
	 * 获取有效梯台量
	 *
	 * @return 数据集
	 */
	Integer getValidElevator(@Param("sugarSearchDTO") SugarSearchDTO sugarSearchDTO);

	/**
	 * 更新合同状态
	 *
	 * @param buildingContractPlus 合同对象
	 * @return 数据集
	 */
	Integer update(BuildingContractPlus buildingContractPlus);

	/**
	 * 获取合同的待更新电梯数据
	 *
	 * @return 数据集
	 */
	List<ContractElevatorVo> getContractElevator();

	/**
	 * 获取 Hover 结构
	 *
	 * @param contractId 合同id
	 * @return hover结构
	 */
	List<ContractBuildingHoverVo> getHoverList(Long contractId);


	/**
	 * 用户合同信息版本升级信息初始化
	 * 后期删除
	 *
	 * @return 数据集
	 */
	List<ElevatorDetail> getElevatorDetailList();


	/**
	 * 获取所有的合同电梯信息
	 *
	 * @return 数据集
	 */
	List<MaintainPlanConfig> getMaintainPlanConfigList();


	/**
	 * 获取合同的统计信息
	 *
	 * @return 数据集
	 */
	List<ContractElevatorVo> getContractStatistic_v2();


	/**
	 * 有保养排期-待续签
	 *
	 * @return
	 */
	List<ContractElevatorVo> hasPlanContract();

	/**
	 * 有保养排期-待续签
	 *
	 * @return
	 */
	List<ContractElevatorVo> hasPlanContractPrices();

	/**
	 * 下载Excel---一次性
	 *
	 * @return 数据集
	 */
	List<ConEleDisposableVo> downExcel();

	/**
	 * 根据电梯id 获取下一份合同 并且是审核通过，待生效的
	 *
	 * @param elevatorId 电梯id
	 * @return 数据集
	 */
	BuildingContractPlus getNext(Long elevatorId);

	/**
	 * 获取合同的统计信息
	 *
	 * @return 数据集
	 */
	List<BuildingContractPlus> getContractStatistic(@Param("contractSearchDTO") ContractSearchDTO contractSearchDTO);

	/**
	 * 维保-获取合同列表
	 *
	 * @return 数据集
	 */
	List<ContractListVo> getAboutEndTimeList(IPage page, @Param("contractSearchDTO") ContractSearchDTO contractSearchDTO);


	/**
	 * 非维保-获取合同列表
	 *
	 * @return 数据集
	 */
	List<ContractListVo> getDisAboutEndTimeList(IPage page, @Param("contractSearchDTO") ContractSearchDTO contractSearchDTO);

	/**
	 * 获取待审核的数量统计
	 *
	 * @param type 1:服务0：非服务
	 * @return
	 */
	Integer getContractDisCheckCounts(Integer type);


	/**
	 * 获取待审核的合同统计
	 *
	 * @param page              分页
	 * @param contractSearchDTO 查询
	 * @return 数据集
	 */
	List<ContractListVo> getContractDisCheckList(IPage<ContractListVo> page, @Param("contractSearchDTO") ContractSearchDTO contractSearchDTO);


	/**
	 * 获取在时间范围内的合同
	 *
	 * @param page              分页
	 * @param contractSearchDTO 搜索条件
	 * @return 数据集
	 */
	List<ContractInTimeVo> getContractInTimeList(IPage<ContractInTimeVo> page, @Param("contractSearchDTO") ContractSearchDTO contractSearchDTO);

	/**
	 * 获取脱保合同列表
	 * @param page              分页
	 * @param contractSearchDTO 搜索条件
	 * @return 数据集
	 */
	List<ContractListVo> getContractTuoList(IPage<ContractListVo> page,@Param("contractSearchDTO") ContractSearchDTO contractSearchDTO);
}
